class Bluetooth {
	_deviceId=null
	// 初始化蓝牙模块
	open() {
		uni.openBluetoothAdapter({
			mode:"central",
			success(res) {
				console.log("central"+res)
			},
			fail(e) {
				console.log("central")
				console.log(e)
			}
		})
		
		uni.openBluetoothAdapter({
			mode:"peripheral",
			success(res) {
				console.log("peripheral"+res)
			},
			fail(e) {
				console.log("peripheral")
				console.log(e)
			}
		})
	}
	// 帮助函数
	ab2hex(buffer) {
		const hexArr = Array.prototype.map.call(
			new Uint8Array(buffer),
			function(bit) {
				return ('00' + bit.toString(16)).slice(-2)
			}
		)
		return hexArr.join('')
	}
	// 监听寻找到新设备的事件
	deviceFound() {
		uni.onBluetoothDeviceFound(function(devices) {
			console.log('new device list has founded')
			console.dir(devices)
			console.log(this.ab2hex(devices[0].advertisData))
		})
	}

	// 停止搜寻附近的蓝牙外围设备。若已经找到需要的蓝牙设备并不需要继续搜索时，建议调用该接口停止蓝牙搜索
	stopDiscovery() {
		uni.stopBluetoothDevicesDiscovery({
			success(res) {
				console.log(res)
			}
		})
	}
	// 监听蓝牙适配器状态变化事件
	stateChange() {
		uni.onBluetoothAdapterStateChange(function(res) {
			console.log('adapterState changed, now is', res)
		})
	}
	// 根据 uuid 获取处于已连接状态的设备。
	connectedBluetoothDevices(){
		uni.getBluetoothDevices({
		  success(res) {
		    console.log(res)
		    if (res.devices[0]) {
		      console.log(this.ab2hex(res.devices[0].advertisData))
		    }
		  }
		})
	}
	// 获取本机蓝牙适配器状态。
	bluetoothAdapterState(){
		uni.getBluetoothAdapterState({
		  success(res) {
		    console.log(res)
		  }
		})
	}
	closeBluetooth(){
		uni.closeBluetoothAdapter({
		  success(res) {
		    console.log(res)
		  }
		})
	}
	// 低功耗连接
	createBLEConnection(){
		if(this._deviceId){
			let _deviceId = this._deviceId
			uni.createBLEConnection({
			  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
			  _deviceId,
			  success(res) {
			    console.log(res)
			  }
			})
		}
	}
	setBLEMTU(){
		
	}
	// 向低功耗蓝牙设备特征值中写入二进制数据。
	writeBLECharacteristicValue(deviceId,serviceId,characteristicId){
		// 向蓝牙设备发送一个0x00的16进制数据
		const buffer = new ArrayBuffer(1)
		const dataView = new DataView(buffer)
		dataView.setUint8(0, 0)
		uni.writeBLECharacteristicValue({
		  // 这里的 deviceId 需要在 getBluetoothDevices 或 onBluetoothDeviceFound 接口中获取
		  deviceId,
		  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
		  serviceId,
		  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
		  characteristicId,
		  // 这里的value是ArrayBuffer类型
		  value: buffer,
		  success(res) {
		    console.log('writeBLECharacteristicValue success', res.errMsg)
		  }
		})
	}
	// 读取低功耗蓝牙设备的特征值的二进制数据值
	readBLECharacteristicValue(deviceId,serviceId,characteristicId,buffer){
		uni.onBLECharacteristicValueChange(function (characteristic) {
		  console.log('characteristic value comed:', characteristic)
		})
		uni.readBLECharacteristicValue({
		  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
		  deviceId,
		  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
		  serviceId,
		  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
		  characteristicId,
		  success(res) {
		    console.log('readBLECharacteristicValue:', res.errCode)
		  }
		})
	}
	// 监听低功耗蓝牙连接状态的改变事件。包括开发者主动连接或断开连接，设备丢失，连接异常断开等等
	onBLEConnectionStateChange(deviceId,){
		uni.onBLEConnectionStateChange(function (res) {
		  // 该方法回调中可以用于处理连接意外断开等异常情况
		  console.log(`device ${res.deviceId} state has changed, connected: ${res.connected}`)
		})
	}
	// 监听低功耗蓝牙设备的特征值变化事件
	onBLECharacteristicValueChange(){
		uni.onBLECharacteristicValueChange(function (res) {
		  console.log(`characteristic ${res.characteristicId} has changed, now is ${res.value}`)
		  console.log(ab2hex(res.value))
		})
	}
	// 启用低功耗蓝牙设备特征值变化时的 notify 功能，订阅特征值
	notifyBLECharacteristicValueChange(){
		uni.notifyBLECharacteristicValueChange({
		  state: true, // 启用 notify 功能
		  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
		  deviceId,
		  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
		  serviceId,
		  // 这里的 characteristicId 需要在 getBLEDeviceCharacteristics 接口中获取
		  characteristicId,
		  success(res) {
		    console.log('notifyBLECharacteristicValueChange success', res.errMsg)
		  }
		})
	}
	
	// 获取蓝牙设备所有服务(service)。
	getBLEDeviceServices(deviceId){
		uni.getBLEDeviceServices({
		  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
		  deviceId,
		  success(res) {
		    console.log('device services:', res.services)
		  }
		})
	}
	// 获取蓝牙设备的信号强度
	getBLEDeviceRSSI(deviceId,serviceId){
		uni.getBLEDeviceCharacteristics({
		  // 这里的 deviceId 需要已经通过 createBLEConnection 与对应设备建立链接
		  deviceId,
		  // 这里的 serviceId 需要在 getBLEDeviceServices 接口中获取
		  serviceId,
		  success(res) {
		    console.log('device getBLEDeviceCharacteristics:', res.characteristics)
		  }
		})
	}
	closeBLEConnection(deviceId){
		uni.closeBLEConnection({
		  deviceId,
		  success(res) {
		    console.log(res)
		  }
		})
	}
}

export default Bluetooth